<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // 对象(数据):  对一个或一类事物特征和行为的描述

    // 对象的特性:
    // 1. 对象是以键值对(key:value)的形式存在,对应键名取值和赋值,排名不分先后
    // 点语法      对象.属性名  => 快捷取值和赋值  zhang.name
    // 中括号语法  对象["属性名"]  => 通常配合变量和字符串使用  zhang["name"]

    // 对象对应下标取值时,如果取一个不存在的属性名 => 默认返回undefined
    //            赋值时,如果对一个不存在的属性名赋值 => 新增该属性到对象中(向对象中添加属性)   

    // 2. 对象可以被循环遍历  (for...in循环遍历)


    // 注意: 
    // 对象的键名也是字符串类型,可以省略不写
    // 键值可以是任意类型


    var zhang = new Object({
        name: "张三", // 属性
        age: 18,
        isStudy: true,
        chinese: 75,
        math: 66,
        english: 77,
        hobby: ["唱", "跳", "rap"],
        say: function () { // 函数 => 方法
            console.log("hello");
        }
    });
    console.log(zhang);

    // 点语法   => 快捷取值和赋值
    // 取值
    // console.log(zhang.name);
    // console.log(zhang.age);
    console.log(zhang.say);
    zhang.say();

    // 赋值:
    // zhang.name = "李四";
    // zhang.age = 25;
    // zhang.hobby.push("篮球");
    // console.log(zhang);


    // 中括号语法
    // 取值
    // console.log(zhang["name"]);
    // console.log(zhang["age"]);
    // console.log(zhang["say"]);
    // zhang["say"]();


    // 赋值
    // zhang["name"] = "李四";
    // zhang["age"] = 26;
    // zhang.hobby.push("玩游戏");
    // console.log(zhang);

    // 拓展
    // console.log(zhang.class);

    // zhang.class = "2207";
    // console.log(zhang);



    // 遍历对象
    // for (var key in zhang) {
    //     // key 变量名 => 存储键名 "name" "age"
    //     console.log(key, zhang[key]);  // zhang ["name"]
    // }


    // for (var val of zhang) {  // for...of ES6新增遍历数组和伪数组的,默认情况下不能遍历对象
    //     console.log(val);
    // }
</script>

</html>